﻿using System;
using DevExpress.XtraEditors;
using FastReport;
using System.Windows.Forms;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Configuration;

namespace PuanYonetimi
{
    public partial class frmCekBaski : XtraForm
    {
        List<PuanTanim> tanimlar = new List<PuanTanim>();
        string MagazaKodu = ConfigurationManager.AppSettings["MagazaKodu"];
        string MagazaAdi = ConfigurationManager.AppSettings["MagazaAdi"];
        bool tanimlarYuklendi = false;

        public frmCekBaski()
        {
            InitializeComponent();
        }

        private void frmCekBaski_Load(object sender, EventArgs e)
        {
            using (PromoEntities ent = new PromoEntities())
            {
                if (!tanimlarYuklendi)
                {
                    tanimlar = ent.PuanTanimlari.Where(x => x.BaslangicTarihi <= DateTime.Now && x.BitisTarihi >= DateTime.Now && x.No < 99).ToList();
                    tanimlarYuklendi = true;
                }
            }
            txtFiltre.Focus();
        }

        private void PuanKarsiligiHesapla(string carikod)
        {
            PuanTanim tanim = AktifTanim(carikod);
            if (tanim != null)
            {
                txtPuanKarsiligi.Text = (double.Parse(txtKullanilacak.Text) / tanim.PuanParaKarsiligi * tanim.AlisverisPuani).ToString("n2");
            }
        }

        private PuanTanim AktifTanim(string cariKodu)
        {
            //11*-12*-25*=38*
            //CARI.DAT’ DA KAYITLI OLAN VE CARIKODU 11 VE 12 İLE 
            //BAŞLAYAN VEYA CARIKODLARININ BAŞLANGICI 25 DEN BÜYÜK 
            //EŞİT VE 38DEN  KÜÇÜK EŞİT OLANLAR

            PuanTanim tanim = null;
            foreach (var item in tanimlar)
            {
                if (item.MusteriAraligi == "")
                {
                    tanim = item;
                    break;
                }
                else
                {
                    if (item.MusteriAraligi == cariKodu) //tek cari için tanımlanmışsa
                    {
                        tanim = item;
                        break;
                    }
                    else //filtre uygulanmışsa
                    {
                        string[] filtreler = item.MusteriAraligi.Split('-');
                        if (filtreler.Length > 0)
                        {
                            foreach (string filtre in filtreler)
                            {
                                if (filtre.IndexOf('=') > -1)
                                {
                                    string[] tmp1 = filtre.Replace("=", "").Split('*');
                                    int c1 = Cevir.Parse<int>(cariKodu.Mid(0, tmp1[0].Length));
                                    int c2 = Cevir.Parse<int>(cariKodu.Mid(0, tmp1[1].Length));
                                    if (c1 >= Cevir.Parse<int>(tmp1[0]) && c2 <= Cevir.Parse<int>(tmp1[1]))
                                    {
                                        tanim = item;
                                        break;
                                    }
                                }
                                else if (filtre.IndexOf('*') > -1)
                                {
                                    string tmp2 = filtre.Replace("*", "");
                                    if (cariKodu.Mid(0, tmp2.Length) == tmp2)
                                    {
                                        tanim = item;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return tanim;
        }

        private void TLKarsiligiHesapla(string carikod)
        {
            PuanTanim tanim = AktifTanim(carikod);
            if (tanim != null)
            {
                txtTLKarsilik.Text = (double.Parse(txtPuan.Text) / tanim.AlisverisPuani * tanim.PuanParaKarsiligi).ToString("n2");
            }
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            decimal mevcutTl = -1;
            if (!string.IsNullOrEmpty(txtTLKarsilik.Text))
                mevcutTl = decimal.Parse(txtTLKarsilik.Text);

            decimal kullanilacakTL = 0;
            if (!string.IsNullOrEmpty(txtKullanilacak.Text))
                kullanilacakTL = decimal.Parse(txtKullanilacak.Text);

            if (!string.IsNullOrEmpty(txtMusteri.Text) && kullanilacakTL > 0 && kullanilacakTL <= mevcutTl)
            {
                PrintCek();
            }
            else
            {
                MessageBox.Show("Yeterli puan yok !");
            }
        }

        private void MusteriListele()
        {
            using (PromoEntities ent = new PromoEntities())
            {
                var cari = ent.Cariler.Where(x => x.Adi.StartsWith(txtFiltre.Text) || x.Adi.Contains(txtFiltre.Text)).Select(x => new { x.Kodu, x.Adi }).ToList();
                gridControl1.DataSource = cari;
                gridControl1.Focus();
            }
        }

        private void MusteriBul()
        {
            using (PromoEntities ent = new PromoEntities())
            {
                var cari = ent.Cariler.Where(x => x.Kodu == txtFiltre.Text).FirstOrDefault();
                if (cari != null)
                {
                    txtMusteri.Text = cari.Adi;
                    txtMusteri.Tag = cari.Kodu;

                    var puan = ent.BonusPuanlar.Where(x => x.Cari_Kod == cari.Kodu).FirstOrDefault();
                    if (puan != null)
                    {
                        if (puan.Puan.HasValue)
                            txtPuan.Text = puan.Puan.Value.ToString("n2");

                        if (puan.ToplamTutar.HasValue)
                            txtTLKarsilik.Text = puan.ToplamTutar.Value.ToString("n2");

                        if (puan.Puan > 0)
                            txtKullanilacak.Focus(); //eğer yeterli puan varsa gönder

                        TLKarsiligiHesapla(cari.Kodu);
                    }
                    txtFiltre.Text = "";
                }
                else
                {
                    MessageBox.Show("Müşteri Bulunamadı !");
                    YeniEkran();
                }
            }
        }


        private void PrintCek()
        {
            string fileName = Application.StartupPath + "\\CekDizayn.dsx";
            if (File.Exists(fileName))
            {
                //data oluşturma kısmı
                PrintDesing cekEvrak = new PrintDesing();
                cekEvrak.BaslangicTarihi = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
                cekEvrak.BitisTarihi = cekEvrak.BaslangicTarihi.AddDays(10);
                cekEvrak.CekKodu = CekNoOlustur();
                cekEvrak.MusteriKodu = txtMusteri.Tag.ToString();
                cekEvrak.MusteriUnvani = txtMusteri.Text;
                cekEvrak.Tutar = decimal.Parse(txtKullanilacak.Text);
                cekEvrak.SubeKodu = MagazaKodu;
                CekEvrakKayit(cekEvrak);
                //***************

                Report report = Report.FromFile(fileName);
                report.RegisterData(new System.Windows.Forms.BindingSource { DataSource = cekEvrak }, "Document", 1);
                report.GetDataSource("Document").Enabled = true;
                report.PrintSettings.Printer = Program.Session[Settings.CekPrinter].ToString();
                report.Prepare();
                report.Print();
            }

            YeniEkran();
        }

        private void CekEvrakKayit(PrintDesing doc)
        {
            PuanTanim tanim = AktifTanim(doc.MusteriKodu);
            if (tanim != null)
            {
                using (PromoEntities ent = new PromoEntities())
                {
                    IndirimCek cek = new IndirimCek();
                    cek.Cek_No = doc.CekKodu;
                    cek.Baslangic = tanim.BaslangicTarihi;
                    cek.Bitis = tanim.BitisTarihi;
                    cek.Cari_Kod = doc.MusteriKodu;
                    cek.Puan = decimal.Parse(txtPuanKarsiligi.Text);
                    cek.Tutar = decimal.Parse(txtKullanilacak.Text);
                    ent.AddToIndirimCekleri(cek);
                    ent.SaveChanges();
                }
            }
        }


        private string CekNoOlustur()
        {
            using (PromoEntities ent = new PromoEntities())
            {
                string rnd = new Random().Next(1, 999999999).ToString("000000000");
                if (ent.IndirimCekleri.Where(x => x.Cek_No == rnd).Count() > 0)
                {
                    return CekNoOlustur();
                }
                else
                    return rnd;
            }
        }


        private void simpleButton2_Click(object sender, EventArgs e)
        {
            YeniEkran();
        }

        private void YeniEkran()
        {
            txtFiltre.Text = "";
            txtKullanilacak.Text = "";
            txtMusteri.Text = "";
            txtPuan.Text = "";
            txtTLKarsilik.Text = "";
            txtMusteri.Tag = null;
            txtPuanKarsiligi.Text = "";
            txtFiltre.Focus();
        }

        private void txtFiltre_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!string.IsNullOrEmpty(txtFiltre.Text))
                {
                    MusteriBul();
                }
            }
        }

        private void txtFiltre_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            if (!string.IsNullOrEmpty(txtFiltre.Text))
            {
                MusteriListele();
            }
        }

        private void gridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (gridView1.FocusedRowHandle > -1)
                {
                    txtFiltre.Text = gridView1.GetFocusedRowCellValue(gridView1.Columns[0]).ToString();
                    if (!string.IsNullOrEmpty(txtFiltre.Text))
                        MusteriBul();
                }
            }
        }

        private void txtKullanilacak_EditValueChanged(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtKullanilacak.Text))
                PuanKarsiligiHesapla(txtMusteri.Tag.ToString());
        }

        private void gridControl1_DoubleClick(object sender, EventArgs e)
        {
            if (gridView1.FocusedRowHandle > -1)
            {
                txtFiltre.Text = gridView1.GetFocusedRowCellValue(gridView1.Columns[0]).ToString();
                if (!string.IsNullOrEmpty(txtFiltre.Text))
                    MusteriBul();
            }
        }
    }
}
